using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;

// 测试颜色分配逻辑
public class ColorAssignmentTest
{
    // 头像颜色池
    private static readonly string[] AvatarColorPool = {
        "#FF6B6B", // 红色
        "#4ECDC4", // 青色
        "#45B7D1", // 蓝色
        "#96CEB4", // 绿色
        "#FFEAA7", // 黄色
        "#DDA0DD", // 紫色
        "#FFB347", // 橙色
        "#87CEEB", // 天蓝色
        "#98FB98", // 浅绿色
        "#F0E68C", // 卡其色
        "#FF69B4", // 粉色
        "#20B2AA", // 海绿色
        "#FF6347", // 番茄色
        "#9370DB", // 中紫色
        "#32CD32"  // 酸橙绿
    };
    
    // 跟踪已使用的头像颜色
    private static readonly ConcurrentDictionary<string, HashSet<string>> _usedAvatarColors = new();
    
    // 为玩家分配头像颜色
    private static string AssignAvatarColorToRoom(string roomCode)
    {
        // 获取当前房间已使用的头像颜色集合
        var roomUsedAvatarColors = _usedAvatarColors.GetOrAdd(roomCode, _ => new HashSet<string>());
        
        // 找到第一个在当前房间中未使用的头像颜色
        var availableAvatarColor = AvatarColorPool.FirstOrDefault(color => !roomUsedAvatarColors.Contains(color));
        
        if (availableAvatarColor != null)
        {
            // 将头像颜色添加到当前房间的已使用集合中
            roomUsedAvatarColors.Add(availableAvatarColor);
            Console.WriteLine($"为房间 {roomCode} 分配头像颜色: {availableAvatarColor}");
            return availableAvatarColor;
        }
        
        // 如果当前房间的所有头像颜色都被使用，随机选择一个
        var randomAvatarColor = AvatarColorPool[new Random().Next(AvatarColorPool.Length)];
        Console.WriteLine($"房间 {roomCode} 的头像颜色池已满，随机分配颜色: {randomAvatarColor}");
        return randomAvatarColor;
    }
    
    // 根据头像颜色生成画笔颜色
    private static string GenerateBrushColorFromAvatar(string avatarColor)
    {
        // 解析头像颜色的RGB值
        var hex = avatarColor.TrimStart('#');
        var r = Convert.ToInt32(hex.Substring(0, 2), 16);
        var g = Convert.ToInt32(hex.Substring(2, 2), 16);
        var b = Convert.ToInt32(hex.Substring(4, 2), 16);
        
        // 生成稍微深一点的画笔颜色（降低亮度）
        var brushR = Math.Max(0, r - 40);
        var brushG = Math.Max(0, g - 40);
        var brushB = Math.Max(0, b - 40);
        
        // 转换为十六进制
        var brushColor = $"#{brushR:X2}{brushG:X2}{brushB:X2}";
        Console.WriteLine($"根据头像颜色 {avatarColor} 生成画笔颜色: {brushColor}");
        
        return brushColor;
    }
    
    // 为房间分配颜色
    private static (string avatarColor, string brushColor) AssignColorsToRoom(string roomCode)
    {
        var avatarColor = AssignAvatarColorToRoom(roomCode);
        var brushColor = GenerateBrushColorFromAvatar(avatarColor);
        
        Console.WriteLine($"为房间 {roomCode} 分配颜色 - 头像: {avatarColor}, 画笔: {brushColor}");
        
        return (avatarColor, brushColor);
    }
    
    public static void Main()
    {
        Console.WriteLine("=== 颜色分配测试 ===");
        
        string roomCode = "test-room";
        
        // 测试多个玩家加入
        for (int i = 1; i <= 5; i++)
        {
            Console.WriteLine($"\n--- 玩家 {i} 加入 ---");
            var (avatarColor, brushColor) = AssignColorsToRoom(roomCode);
            Console.WriteLine($"玩家 {i}: 头像={avatarColor}, 画笔={brushColor}");
        }
        
        // 显示房间已使用的颜色
        if (_usedAvatarColors.TryGetValue(roomCode, out var usedColors))
        {
            Console.WriteLine($"\n房间 {roomCode} 已使用的头像颜色: {string.Join(", ", usedColors)}");
        }
        
        Console.WriteLine("\n=== 测试完成 ===");
    }
}
